#!/bin/bash

# 网络管理器GUI RPM打包脚本
# 将程序及其依赖打包成标准的RPM安装包

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="$SCRIPT_DIR"
RPM_BUILD_DIR="$SCRIPT_DIR/rpm_build"
APP_NAME="network_manager_gui"
PACKAGE_NAME="network-manager-gui"
VERSION="1.0.0"
RELEASE="1"
ARCH="x86_64"

echo "开始构建RPM包: $PACKAGE_NAME-$VERSION-$RELEASE.$ARCH.rpm"

# 清理之前的构建
rm -rf "$RPM_BUILD_DIR"
mkdir -p "$RPM_BUILD_DIR"

# 创建RPM构建目录结构
mkdir -p "$RPM_BUILD_DIR/BUILD"
mkdir -p "$RPM_BUILD_DIR/BUILDROOT"
mkdir -p "$RPM_BUILD_DIR/RPMS"
mkdir -p "$RPM_BUILD_DIR/SOURCES"
mkdir -p "$RPM_BUILD_DIR/SPECS"
mkdir -p "$RPM_BUILD_DIR/SRPMS"

# 创建临时安装目录
INSTALL_DIR="$RPM_BUILD_DIR/BUILDROOT/$PACKAGE_NAME-$VERSION-$RELEASE.$ARCH"
mkdir -p "$INSTALL_DIR/opt/netmanager"
mkdir -p "$INSTALL_DIR/opt/netmanager/lib"
mkdir -p "$INSTALL_DIR/opt/netmanager/resources"
mkdir -p "$INSTALL_DIR/usr/share/applications"

# 复制可执行文件
echo "复制可执行文件..."
cp "$BUILD_DIR/$APP_NAME" "$INSTALL_DIR/opt/netmanager/"

# 获取依赖库列表
echo "分析依赖库..."
DEPS=$(ldd "$BUILD_DIR/$APP_NAME" | grep "=>" | awk '{print $3}' | grep -v "not found" | sort | uniq)

# 排除系统基础库列表（这些库必须使用系统版本，不应该打包）
# 原则：只打包应用特定的库（Qt、polkit等），排除所有系统基础库
EXCLUDE_PATTERNS=(
    "/lib64/libc.so"
    "/lib64/libm.so"
    "/lib64/libpthread.so"
    "/lib64/libdl.so"
    "/lib64/libresolv.so"
    "/lib64/librt.so"
    "/lib64/libgcc_s.so"
    "/lib64/libstdc++.so"
    "/lib/x86_64-linux-gnu/libc.so"
    "/lib/x86_64-linux-gnu/libm.so"
    "/lib/x86_64-linux-gnu/libpthread.so"
    "/lib/libc.so"
    "/lib/libm.so"
    "/usr/lib64/libc.so"
    "/usr/lib64/libm.so"
)

# 只打包应用特定的库（白名单方式更安全）
# 只打包：Qt库、polkit库及其直接依赖，其他系统库一律排除
INCLUDE_PATTERNS=(
    "/usr/lib64/libQt"
    "/usr/lib64/libpolkit"
    "/usr/lib64/libdbus"
    "/usr/lib64/libgio"
    "/usr/lib64/libglib"
    "/usr/lib64/libgobject"
    "/usr/lib64/libgmodule"
)

# 复制依赖库（只打包应用特定的库）
echo "复制依赖库（只打包应用特定库，排除系统基础库）..."
COPIED_COUNT=0
SKIPPED_COUNT=0

for lib in $DEPS; do
    if [ -f "$lib" ]; then
        # 检查是否应该排除（系统基础库）
        EXCLUDE=false
        for pattern in "${EXCLUDE_PATTERNS[@]}"; do
            if [[ "$lib" == *"$pattern"* ]]; then
                EXCLUDE=true
                echo "跳过系统基础库: $(basename $lib)"
                SKIPPED_COUNT=$((SKIPPED_COUNT + 1))
                break
            fi
        done
        
        # 如果不是系统基础库，检查是否是需要打包的应用库
        if [ "$EXCLUDE" = false ]; then
            SHOULD_COPY=false
            for pattern in "${INCLUDE_PATTERNS[@]}"; do
                if [[ "$lib" == *"$pattern"* ]]; then
                    SHOULD_COPY=true
                    break
                fi
            done
            
            # 如果是应用库的依赖（如libz、libpng等），也打包
            # 但排除系统核心库
            if [ "$SHOULD_COPY" = false ]; then
                # 检查是否是/usr/lib64下的库（通常是应用库）
                if [[ "$lib" == "/usr/lib64"* ]] || [[ "$lib" == "/usr/lib"* ]]; then
                    # 排除已知的系统库
                    if [[ "$lib" != *"/usr/lib64/libX11"* ]] && \
                       [[ "$lib" != *"/usr/lib64/libxcb"* ]] && \
                       [[ "$lib" != *"/usr/lib64/libGL"* ]] && \
                       [[ "$lib" != *"/usr/lib64/libdrm"* ]]; then
                        SHOULD_COPY=true
                    fi
                fi
            fi
            
            if [ "$SHOULD_COPY" = true ]; then
                echo "复制应用库: $(basename $lib)"
                cp "$lib" "$INSTALL_DIR/opt/netmanager/lib/"
                COPIED_COUNT=$((COPIED_COUNT + 1))
            else
                echo "跳过系统库: $(basename $lib)"
                SKIPPED_COUNT=$((SKIPPED_COUNT + 1))
            fi
        fi
    fi
done

echo "库复制完成: 已复制 $COPIED_COUNT 个，已跳过 $SKIPPED_COUNT 个系统库"

# 复制Qt平台插件
echo "复制Qt平台插件..."
QT_PLUGIN_DIRS=(
    "/usr/lib64/qt5/plugins"
    "/usr/lib/qt5/plugins"
    "/usr/lib/x86_64-linux-gnu/qt5/plugins"
)

PLUGINS_COPIED=false
for QT_DIR in "${QT_PLUGIN_DIRS[@]}"; do
    if [ -d "$QT_DIR/platforms" ]; then
        mkdir -p "$INSTALL_DIR/opt/netmanager/lib/qt5/plugins/platforms"
        echo "找到Qt插件目录: $QT_DIR"
        # 复制平台插件
        if [ -f "$QT_DIR/platforms/libqxcb.so" ]; then
            cp "$QT_DIR/platforms/libqxcb.so" "$INSTALL_DIR/opt/netmanager/lib/qt5/plugins/platforms/"
            echo "复制平台插件: libqxcb.so"
            PLUGINS_COPIED=true
        fi
        # 复制xcb相关插件
        if [ -d "$QT_DIR/xcbglintegrations" ]; then
            mkdir -p "$INSTALL_DIR/opt/netmanager/lib/qt5/plugins/xcbglintegrations"
            cp -r "$QT_DIR/xcbglintegrations"/* "$INSTALL_DIR/opt/netmanager/lib/qt5/plugins/xcbglintegrations/" 2>/dev/null || true
            echo "复制xcbglintegrations插件"
        fi
        break
    fi
done

if [ "$PLUGINS_COPIED" = false ]; then
    echo "警告: 未找到Qt平台插件，程序可能无法启动图形界面"
fi

# 修改可执行文件的RPATH，使其使用相对路径
echo "修改可执行文件的库路径..."
if command -v patchelf >/dev/null 2>&1; then
    patchelf --set-rpath '$ORIGIN/lib' "$INSTALL_DIR/opt/netmanager/$APP_NAME"
    echo "使用patchelf设置RPATH成功"
else
    echo "警告: patchelf未安装，将使用启动脚本设置库路径"
fi

# 复制资源文件
echo "复制资源文件..."
cp -r "$BUILD_DIR/resources"/* "$INSTALL_DIR/opt/netmanager/resources/"

# 创建启动脚本
echo "创建启动脚本..."
cat > "$INSTALL_DIR/opt/netmanager/run.sh" << 'EOF'
#!/bin/bash

# 网络管理器GUI启动脚本
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 设置库路径（如果patchelf未使用）
export LD_LIBRARY_PATH="$SCRIPT_DIR/lib:$LD_LIBRARY_PATH"

# 设置Qt插件路径
# 优先使用本地插件，如果不存在则尝试系统插件
if [ -d "$SCRIPT_DIR/lib/qt5/plugins" ]; then
    export QT_PLUGIN_PATH="$SCRIPT_DIR/lib/qt5/plugins"
elif [ -d "/usr/lib64/qt5/plugins" ]; then
    export QT_PLUGIN_PATH="/usr/lib64/qt5/plugins"
elif [ -d "/usr/lib/qt5/plugins" ]; then
    export QT_PLUGIN_PATH="/usr/lib/qt5/plugins"
fi

# 设置Qt平台插件路径（用于调试）
if [ -n "$QT_DEBUG_PLUGINS" ]; then
    export QT_DEBUG_PLUGINS=1
fi

# 检查可执行文件
if [ ! -f "$SCRIPT_DIR/network_manager_gui" ]; then
    echo "错误: 未找到可执行文件 $SCRIPT_DIR/network_manager_gui"
    exit 1
fi

# 检查可执行权限
if [ ! -x "$SCRIPT_DIR/network_manager_gui" ]; then
    echo "错误: 可执行文件没有执行权限"
    exit 1
fi

# 启动程序
exec "$SCRIPT_DIR/network_manager_gui" "$@"
EOF

chmod +x "$INSTALL_DIR/opt/netmanager/run.sh"

# 创建桌面快捷方式
echo "创建桌面快捷方式..."
cat > "$INSTALL_DIR/usr/share/applications/network-manager-gui.desktop" << 'EOF'
[Desktop Entry]
Version=1.0
Type=Application
Name=网络连接管理器
Name[en]=Network Connection Manager
Comment=Linux网络连接管理器
Comment[en]=Linux Network Connection Manager
Exec=/opt/netmanager/run.sh
Icon=/opt/netmanager/resources/logo.png
Terminal=false
Categories=System;Network;
Keywords=network;connection;manager;gui;
EOF

# 创建命令行快捷方式
mkdir -p "$INSTALL_DIR/usr/local/bin"
ln -sf "/opt/netmanager/run.sh" "$INSTALL_DIR/usr/local/bin/network-manager-gui"

# 创建RPM spec文件
echo "创建RPM spec文件..."
cat > "$RPM_BUILD_DIR/SPECS/$PACKAGE_NAME.spec" << EOF
Name:           $PACKAGE_NAME
Version:        $VERSION
Release:        $RELEASE
Summary:        Linux网络连接管理器GUI
License:        GPLv3
URL:            https://github.com/btwise/network-manager-gui
BuildArch:      $ARCH
AutoReqProv:    no

%description
Linux网络连接管理器GUI是一个基于Qt5的图形界面工具，用于管理Linux系统的网络连接。
支持以太网、WiFi、VPN等多种网络连接类型的管理和配置。

%files
%defattr(-,root,root,-)
/opt/netmanager/
/usr/local/bin/network-manager-gui
/usr/share/applications/network-manager-gui.desktop

%post
# 安装后脚本
echo "网络管理器GUI安装完成！"
echo "可以通过以下方式启动程序："
echo "1. 桌面快捷方式"
echo "2. 命令行: network-manager-gui"
echo "3. 直接运行: /opt/netmanager/run.sh"

%preun
# 卸载前脚本
echo "正在卸载网络管理器GUI..."

%postun
# 卸载后脚本
if [ \$1 -eq 0 ]; then
    echo "网络管理器GUI卸载完成！"
fi

%changelog
* $(date '+%a %b %d %Y') $(whoami) <$(whoami)@$(hostname)>
- 初始版本 $VERSION
- 支持网络连接管理
- 支持多种网络类型
- 图形化配置界面
EOF

# 创建RPM包
echo "构建RPM包..."
cd "$RPM_BUILD_DIR"
rpmbuild --define "_topdir $RPM_BUILD_DIR" -bb SPECS/$PACKAGE_NAME.spec

# 复制生成的RPM包到项目目录
RPM_FILE=$(find RPMS -name "*.rpm" | head -1)
if [ -n "$RPM_FILE" ]; then
    cp "$RPM_FILE" "$SCRIPT_DIR/"
    echo "RPM包已创建: $SCRIPT_DIR/$(basename $RPM_FILE)"
else
    echo "错误: 未找到生成的RPM文件"
    exit 1
fi

# 清理构建目录
echo "清理构建目录..."
rm -rf "$RPM_BUILD_DIR"

echo "RPM包构建完成！"
echo "安装方法: sudo rpm -ivh $(basename $RPM_FILE)"
echo "卸载方法: sudo rpm -e $PACKAGE_NAME" 